/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.unesp.rc.locadora.dao.hibernate;

import br.unesp.rc.locadora.beans.*;
import br.unesp.rc.locadora.connection.hibernate.FabricaConexao;
import br.unesp.rc.locadora.utils.DateManager;
import br.unesp.rc.locadora.utils.MySQLUtil;
import com.sun.rowset.CachedRowSetImpl;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import javax.sql.RowSetMetaData;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetMetaDataImpl;
import javax.sql.rowset.spi.SyncProviderException;
import javax.sql.rowset.spi.SyncResolver;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author aluno
 */
public class FisicaDAOImpl implements FisicaDAO {

    public FisicaDAOImpl() {
    }
    
    @Override
    public void print(Fisica f){
        System.out.println("NOME................: " + f.getNome());
        
        String date = DateManager.formatte(f.getDataNascimento());
        System.out.println("DATA DE NASCIMENTO..: " + date);
        
        System.out.println("CPF.................: " + f.getCpf());
        System.out.println("TELEFONE............: " + f.getContato().getTelefone());
        System.out.println("E-MAIL..............: " + f.getContato().getEmail());
        System.out.println("USUARIO.............: " + f.getAcesso().getUsuario());
        System.out.println("SENHA...............: " + f.getAcesso().getSenha());
        System.out.println("RUA.................: " + f.getEndereco().getRua());
        System.out.println("NUMERO..............: " + f.getEndereco().getNumero());
        System.out.println("BAIRRO..............: " + f.getEndereco().getBairro());
        System.out.println("CEP.................: " + f.getEndereco().getCep());
        System.out.println("CIDADE..............: " + f.getEndereco().getCidade());
        System.out.println("ESTADO..............: " + f.getEndereco().getEstado());
    }
    
    @Override
    public boolean cadastrar(Fisica f){
        boolean saved = false;

        Session session = FabricaConexao.getSessao();
        if (session != null) {
            Transaction t = session.beginTransaction();
            try {  
                Fisica fi = new Fisica();
                fi.setNome(f.getNome());
                fi.setDataNascimento(f.getDataNascimento());
                fi.setCpf(f.getCpf());
                session.save(fi);
                
                Acesso a = new Acesso();
                a.setSenha(f.getAcesso().getSenha());
                a.setUsuario(f.getAcesso().getUsuario());
                a.setIdPessoa(fi.getIdPessoa());
                session.save(a);
                
                Endereco e = new Endereco();
                e.setBairro(f.getEndereco().getBairro());
                e.setCep(f.getEndereco().getCep());
                e.setCidade(f.getEndereco().getCidade());
                e.setEstado(f.getEndereco().getEstado());
                e.setNumero(f.getEndereco().getNumero());
                e.setRua(f.getEndereco().getRua());
                e.setIdPessoa(fi.getIdPessoa());
                session.save(e);
                
                Contato c = new Contato();
                c.setEmail(f.getContato().getEmail());
                c.setTelefone(f.getContato().getTelefone());
                c.setIdPessoa(fi.getIdPessoa());
                session.save(c);
                t.commit();
                saved = true;
            } catch (HibernateException ex) {
                System.out.println("Problemas ao inserir: " + ex.getMessage());
                t.rollback();
            } finally{
                FabricaConexao.fechar(session);
            }
        }

        return saved;
    }
    
    @Override
    public boolean cadastrarCache(Fisica f){
        boolean saved = false;

        Session session = FabricaConexao.getSessaoCache();
        if (session != null) {
            try {
                session.save(f);
                saved = true;
            } catch (HibernateException ex) {
                System.out.println("Problemas ao inserir: " + ex.getMessage());
            } finally{
                FabricaConexao.fechar(session);
            }
        }

        return saved;
    }
    
    @Override
    public boolean cadastrarProc(Fisica f){
         boolean saved = false;

        Session session = FabricaConexao.getSessaoProc();
        if (session != null) {
            try {
                Query query = session.getNamedQuery("insereFisica_SP");
                
                query.setString(0, f.getNome());
                query.setDate(1, new java.sql.Date(f.getDataNascimento().getTime()));
                query.setLong(2, f.getCpf());
                query.setString(3, f.getEndereco().getRua());
                query.setInteger(4, f.getEndereco().getNumero());
                query.setString(5, f.getEndereco().getBairro());
                query.setString(6, f.getEndereco().getCep());
                query.setString(7, f.getEndereco().getCidade());
                query.setString(8, f.getEndereco().getEstado());
                query.setString(9, f.getAcesso().getUsuario());
                query.setString(10, f.getAcesso().getSenha());
                query.setString(11, f.getContato().getTelefone());
                query.setString(12, f.getContato().getEmail());
                
                query.executeUpdate();
                        
                saved = true;
            } catch (HibernateException ex) {
                System.out.println("Problemas ao inserir: " + ex.getMessage());
            } finally{
                FabricaConexao.fechar(session);
            }
        }

        return saved;
    }
}
